home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / misc / AmigaSDLsrc.lha / amisrc / SDL_audiodev.c < prev    next >
C/C++ Source or Header  |  2001-04-29  |  5KB  |  183 lines

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
  4.  
  5.     This library is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU Library General Public
  7.     License as published by the Free Software Foundation; either
  8.     version 2 of the License, or (at your option) any later version.
  9.  
  10.     This library is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.     Library General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU Library General Public
  16.     License along with this library; if not, write to the Free
  17.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  
  19.     Sam Lantinga
  20.     slouken@devolution.com
  21. */
  22.  
  23. #ifdef SAVE_RCSID
  24. static char rcsid =
  25.  "@(#) $Id: SDL_audiodev.c,v 1.1.2.3 2001/02/10 22:10:17 hercules Exp $";
  26. #endif
  27.  
  28. /* Get the name of the audio device we use for output */
  29.  
  30. #if defined(unix) || defined(__unix__)
  31.  
  32. #include <stdlib.h>
  33. #include <stdio.h>
  34. #include <fcntl.h>
  35. #include <sys/types.h>
  36. #include <sys/stat.h>
  37. #include <string.h>
  38.  
  39. #include "SDL_audiodev_c.h"
  40.  
  41. #ifndef _PATH_DEV_DSP
  42. #define _PATH_DEV_DSP    "/dev/dsp"
  43. #endif
  44. #ifndef _PATH_DEV_DSP24
  45. #define _PATH_DEV_DSP24    "/dev/sound/dsp"
  46. #endif
  47. #ifndef _PATH_DEV_AUDIO
  48. #define _PATH_DEV_AUDIO    "/dev/audio"
  49. #endif
  50.  
  51.  
  52. int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic)
  53. {
  54.     const char *audiodev;
  55.     int audio_fd;
  56.     char audiopath[1024];
  57.  
  58.     /* Figure out what our audio device is */
  59.     if ( ((audiodev=getenv("SDL_PATH_DSP")) == NULL) &&
  60.          ((audiodev=getenv("AUDIODEV")) == NULL) ) {
  61.         if ( classic ) {
  62.             audiodev = _PATH_DEV_AUDIO;
  63.         } else {
  64.             struct stat sb;
  65.  
  66.             /* Added support for /dev/sound/\* in Linux 2.4 */
  67.             if ( (stat("/dev/sound", &sb) == 0) &&
  68.                  S_ISDIR(sb.st_mode) ) {
  69.                 audiodev = _PATH_DEV_DSP24;
  70.             } else {
  71.                 audiodev = _PATH_DEV_DSP;
  72.             }
  73.         }
  74.     }
  75.     audio_fd = open(audiodev, flags, 0);
  76.  
  77.     /* If the first open fails, look for other devices */
  78.     if ( (audio_fd < 0) && (strlen(audiodev) < (sizeof(audiopath)-3)) ) {
  79.         int exists, instance;
  80.         struct stat sb;
  81.  
  82.         instance = 1;
  83.         do { /* Don't use errno ENOENT - it may not be thread-safe */
  84.             sprintf(audiopath, "%s%d", audiodev, instance++);
  85.             exists = 0;
  86.             if ( stat(audiopath, &sb) == 0 ) {
  87.                 exists = 1;
  88.                 audio_fd = open(audiopath, flags, 0); 
  89.             }
  90.         } while ( exists && (audio_fd < 0) );
  91.         audiodev = audiopath;
  92.     }
  93.     if ( path != NULL ) {
  94.         strncpy(path, audiodev, maxlen);
  95.         path[maxlen-1] = '\0';
  96.     }
  97.     return(audio_fd);
  98. }
  99.  
  100. #elif defined(_AIX)
  101.  
  102. /* Get the name of the audio device we use for output */
  103.  
  104. #include <stdlib.h>
  105. #include <sys/types.h>
  106. #include <sys/stat.h>
  107. #include <string.h>
  108.  
  109. #include "SDL_audiodev_c.h"
  110.  
  111. #ifndef _PATH_DEV_DSP
  112. #define _PATH_DEV_DSP    "/dev/%caud%c/%c"
  113. #endif
  114.  
  115. char devsettings[][3] =
  116. {
  117.     { 'p', '0', '1' }, { 'p', '0', '2' }, { 'p', '0', '3' }, { 'p', '0', '4' },
  118.     { 'p', '1', '1' }, { 'p', '1', '2' }, { 'p', '1', '3' }, { 'p', '1', '4' },
  119.     { 'p', '2', '1' }, { 'p', '2', '2' }, { 'p', '2', '3' }, { 'p', '2', '4' },
  120.     { 'p', '3', '1' }, { 'p', '3', '2' }, { 'p', '3', '3' }, { 'p', '3', '4' },
  121.     { 'b', '0', '1' }, { 'b', '0', '2' }, { 'b', '0', '3' }, { 'b', '0', '4' },
  122.     { 'b', '1', '1' }, { 'b', '1', '2' }, { 'b', '1', '3' }, { 'b', '1', '4' },
  123.     { 'b', '2', '1' }, { 'b', '2', '2' }, { 'b', '2', '3' }, { 'b', '2', '4' },
  124.     { 'b', '3', '1' }, { 'b', '3', '2' }, { 'b', '3', '3' }, { 'b', '3', '4' },
  125.     { '\0', '\0', '\0' }
  126. };
  127.  
  128. static int OpenUserDefinedDevice(char *path, int maxlen, int flags)
  129. {
  130.     const char *audiodev;
  131.     int  audio_fd;
  132.  
  133.     /* Figure out what our audio device is */
  134.     if ((audiodev=getenv("SDL_PATH_DSP")) == NULL) {
  135.         audiodev=getenv("AUDIODEV");
  136.     }
  137.     if ( audiodev == NULL ) {
  138.         return -1;
  139.     }
  140.     audio_fd = open(audiodev, flags, 0);
  141.     if ( path != NULL ) {
  142.         strncpy(path, audiodev, maxlen);
  143.         path[maxlen-1] = '\0';
  144.     }
  145.     return audio_fd;
  146. }
  147.  
  148. int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic)
  149. {
  150.     struct stat sb;
  151.     int         audio_fd;
  152.     char        audiopath[1024];
  153.     int         cycle;
  154.  
  155.     audio_fd = OpenUserDefinedDevice(path,maxlen,flags);
  156.     if ( audio_fd != -1 ) {
  157.         return audio_fd;
  158.     }
  159.  
  160.     cycle    = 0;
  161.     while( devsettings[cycle][0] != '\0' ) {
  162.         sprintf( audiopath,
  163.                  _PATH_DEV_DSP,
  164.                  devsettings[cycle][0],
  165.                  devsettings[cycle][1],
  166.                  devsettings[cycle][2]);
  167.  
  168.     if ( stat(audiopath, &sb) == 0 ) {
  169.         audio_fd = open(audiopath, flags, 0);
  170.         if ( audio_fd > 0 ) {
  171.         if ( path != NULL ) {
  172.             strncpy( path, audiopath, maxlen );
  173.             path[maxlen-1] = '\0';
  174.         }
  175.             return audio_fd;
  176.         }
  177.     }
  178.     }
  179.     return -1;
  180. }
  181.  
  182. #endif /* UNIX system */
  183.